package design_pattern.proxy.dynamicProxy;

import design_pattern.proxy.enhanceService.EnhanceService;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description : 动态代理类
 * 静态代理类，只能为一个接口下的实现类，做代理，做增强；
 * 动态代理，可以为所有接口下的所有实现类，做代理，做增强；
 * Created by cyd on 2021-03-06 20:16:24
 */
public class MyDynamicProxy implements InvocationHandler {

    // 被代理的对象
    private Object obj;

    // 增强方法提供者对象
    private final EnhanceService enhanceProvider = new EnhanceService();

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    /**
     * @Description: 获得动态代理的对象
     * @Params: 目标对象的类加载器，目标对象的接口数组，InvocationHandler的实现类
     * @Return: 动态代理类对象
     */
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(this.obj.getClass().getClassLoader(),
                this.obj.getClass().getInterfaces(), this);
    }

    /**
     * @Description: 通过动态代理，对方法进行前后置增强
     * @Params: 动态代理类对象，原方法，原方法参数数组
     * @Return: 执行方法的返回值
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        enhanceProvider.doSomethingBefore();
        System.out.println(proxy.getClass().getName());
        // 使用实际的对象，来调用方法
        Object result = method.invoke(this.obj, args);
        enhanceProvider.doSomethingEnd();
        return result;
    }

}
